package com.xianggu.mybatis.mapper.demo;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ForeachSqlParser {

    /**
     * 解析 <foreach> 标签
     *
     * @param element <foreach> 标签的 DOM 元素
     * @param parameters 传入的参数
     * @return 解析后的 SQL 片段
     */
    public static String parseForeach(Element element, Map<String, Object> parameters) {
        // 获取 <foreach> 标签的属性
        String collection = element.getAttribute("collection");
        String item = element.getAttribute("item");
        String open = element.getAttribute("open");
        String separator = element.getAttribute("separator");
        String close = element.getAttribute("close");

        // 获取集合参数
        List<?> collectionList = (List<?>) parameters.get(collection);
        if (collectionList == null || collectionList.isEmpty()) {
            throw new IllegalArgumentException("Collection '" + collection + "' is empty or null");
        }

        // 解析 <foreach> 标签的内容
        StringBuilder sql = new StringBuilder();
        sql.append(open); // 添加 open
        for (int i = 0; i < collectionList.size(); i++) {
            Object value = collectionList.get(i);
            // 替换 #{item} 为实际值
            String content = parseForeachContent(element, item, value);
            sql.append(content);
            if (i < collectionList.size() - 1) {
                sql.append(separator); // 添加 separator
            }
        }
        sql.append(close); // 添加 close

        return sql.toString();
    }

    /**
     * 解析 <foreach> 标签的内容
     *
     * @param element <foreach> 标签的 DOM 元素
     * @param item 集合中每个元素的别名
     * @param value 集合中当前元素的值
     * @return 解析后的内容
     */
    private static String parseForeachContent(Element element, String item, Object value) {
        StringBuilder content = new StringBuilder();
        NodeList children = element.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node node = children.item(i);
            if (node.getNodeType() == Node.TEXT_NODE) {
                // 替换 #{item} 为实际值
                String text = node.getTextContent().trim();
                content.append(text.replace("#{" + item + "}", value.toString()));
            } else if (node.getNodeType() == Node.ELEMENT_NODE) {
                // 处理嵌套标签（如 <if> 等）
                throw new UnsupportedOperationException("Nested tags inside <foreach> are not supported");
            }
        }
        return content.toString();
    }

    public static void main(String[] args) {
        // 模拟 MyBatis 的 <foreach> 标签
        String foreachXml = "<foreach collection=\"ids\" item=\"id\" open=\"(\" separator=\",\" close=\")\">" +
                "#{id}" +
                "</foreach>";

        // 模拟参数
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("ids", List.of(1, 2, 3));

        // 解析 <foreach> 标签
//        Element element = XmlUtils.parseXml(foreachXml); // 假设 XmlUtils.parseXml 可以将字符串解析为 DOM 元素
//        String sql = parseForeach(element, parameters);
//        System.out.println("Generated SQL: " + sql);
    }
}